import { AxiosRequestConfig, AxiosResponse } from "axios";
import {
  CreateAxiosOptions,
  RequestOptions,
  Result,
} from "@/utils/http/axios/types";

/**
 * @description axios的处理类，具体实现见继承类。
 */
export abstract class AxiosTransform {
  /**
   * @description 请求前的处理。
   */
  beforeRequestHook?: (
    config: AxiosRequestConfig,
    options: RequestOptions
  ) => AxiosRequestConfig;

  /**
   * @description 请求成功的处理(数据转换等)。
   * @param res 请求从后端获取的数据
   * @param options 配置项
   */
  transformRequestData?: (
    res: AxiosResponse<Result>,
    options: RequestOptions
  ) => any;

  /**
   * @description 请求失败时的处理。
   */
  requestCatch?: (e: Error) => Promise<any>;

  /**
   * @description 请求拦截器 onFulfilled.
   */
  requestInterceptors?: (
    config: AxiosRequestConfig,
    options: CreateAxiosOptions
  ) => AxiosRequestConfig;

  /**
   * @description 请求拦截器 onReject.
   */
  requestInterceptorsCatch?: (error: any) => void;

  /**
   * @description: 响应拦截器 onFulFilled.
   */
  responseInterceptors?: (res: AxiosResponse) => AxiosResponse;

  /**
   * @description: 相应拦截器 onReject.
   */
  responseInterceptorsCatch?: (error: any) => void;
}
